#include<bits/stdc++.h>
using namespace std;
int T, n , m , l , v , res;
struct car{
    int x , v , a;
}c[100005];
int a[1005] , t[10005] = {0};
struct cam{
    int id;
    int cnt = 0;
     int car[3000];
}d[3000];
void check(int ca , int dis , int a , int vn){
    if(a == 0){
        if(vn <= v) return;
        for(int i = 0; i< m; i++){
            if(d[i].id >= dis){
                t[ca]++;
                d[i].car[++d[i].cnt] = ca;
            }
        }
    }else if(a < 0){
        if(vn <= v) return;
        int v2 = vn * vn - v * v;
        a = -a;
        int r = (v2 / 2)/ a;
        if(2 * a * r == v2) r-= 1;
        for(int i = 0; i< m; i++){
            if(d[i].id >= dis && d[i].id <= dis + r){
                t[ca]++;
                d[i].car[++d[i].cnt] = ca;
            }
        }
    }else{
        if(vn > v){
        for(int i = 0; i< m; i++){
            if(d[i].id >= dis){
                t[ca]++;
                d[i].car[++d[i].cnt] = ca;
            }
        }
        return;
        }
        if(vn <= v) return;
        int v2 =v * v -vn * vn;
        int l = (v2 / 2)/ a;
        if(2 * a * l == v2) l += 1;
        for(int i = 0; i< m; i++){
            if(d[i].id >= dis){
                t[ca]++;
                d[i].car[++d[i].cnt] = ca;
            }
        }
    }

}
int check(){
    for(int i = 0; i < n; i++){
        if(t[i] == 0) return -1;
    }
    return 1;
}
int search(int now , int ans){
    if(now == m + 1) return ans;
    if(d[now].cnt == 0) return search(now  + 1 , ans + 1);
    for(int i = 0; i < d[now].cnt; i++){
        t[d[now].car[i]] -= 1;
    }
    if(check()){
            int ans2 = search(now  + 1 , ans + 1);
        for(int i = 0; i < d[now].cnt; i++){
            t[d[now].car[i]] += 1;
        }
    }
    else{
            for(int i = 0; i < d[now].cnt; i++){
                t[d[now].car[i]] += 1;
            }
            return search(now + 1 , ans);
        }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    freopen("detect.in" , "r" , stdin);
    freopen("detect.out" , "w" , stdout);
    cin >> T;
    while(T--){
            memset(t , 0 , sizeof(t));
        cin >> n >> m >> l >> v;
        for(int i = 0; i < n; i++){
            cin >> c[i].x >> c[i].v >> c[i].a;
        }
        for(int i = 0; i < m; i++){
            cin >> d[i].id;
        }
        int cnt = 0;
        for(int i = 0; i < n; i++){
            check(i , c[i].x , c[i].a , c[i].v);
            if(t[i] != 0) cnt++;
               }
                cout << cnt << endl;
                res = m;
    cout << search(1 , 0) << endl;
    }
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}
